package com.dayu.demo.dao;

import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Repository;
import com.vecspace.data.model.FilterColumn;
import com.vecspace.data.model.Pagination;
import com.vecspace.database.dao.AbstractDao;
import com.vecspace.database.dao.DaoUtil;
import com.vecspace.database.model.QueryResultAggregation;
import com.vecspace.database.model.QuerySQL;
import com.vecspace.utils.Assert;
import com.dayu.demo.pojo.Employee;
import com.dayu.demo.pojo.EmployeeEx;
import com.dayu.demo.pojo.EmployeeStats;

/** 员工,操作数据库的dao类
 * @template dayu-code-builder
 * @author user
 * @reviewer 
 * @createTime 2021-11-25 16:23:48
 * @version 1.0
 */
@Repository("demo_employeeDao")
public class EmployeeDao extends AbstractDao {
    /** 根据ID查询 
     * @param id   主键值
     * @return Employee
     * @throws Exception
     * @author user
     * @reviewer 
     * @createTime 2021-11-25 16:23:48
     */
    public Employee getEmployee(Long id) throws Exception {
        Employee employee = null;
        if (id != null) {
            employee = dao.queryObject(Employee.class, id);
            this.dao.evict(employee);
        }
        return employee;
    }


    /**根据 所属部门 获取员工列表
     *
     * @param deptId 所属部门
     * @return
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public List<Employee> getEmployeeListByDept(Long deptId) throws Exception {
        List<Employee> employeeList = dao.queryObjectList("from Employee where deptId=?0 order by ordnum", new Object[]{deptId});
        return employeeList;
    }

    /**根据 所属部门 获取员工记录条数
     *
     * @param deptId  所属部门
     * @return
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public int getEmployeeCountByDept(Long deptId) throws Exception {
        int rcount = dao.queryInt("select count(*) from T_DEMO_EMPLOYEE where DEPT_ID=? order by ordnum", new Object[]{deptId});
        return rcount;
    }

    /**根据属性名获取字段值
     * @param id 记录id
     * @param propName 属性名
     * @return
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public Object getValueByProp(Long id, String propName) throws Exception {
    	return this.getValueByPropName(Employee.class, id, propName);
    }

    /**根据id更新指定字段的值（根据propName从pojo获取字段名）
     * @param id 记录id
     * @param propName 属性名
     * @param value 属性值
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public void updateValueByProp(Long id, String propName, Object value) throws Exception {
    	this.updateValueByPropName(Employee.class, id, propName, value);
    }

    /** 插入或修改 
     * @param item 要保存的对象
     * @return void
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public void saveEmployee(Employee item) throws Exception {
        dao.saveOrUpdateObject(item);
        dao.evict(item);
    }



    /** 根据ID删除 
     * @param id  主键值
     * @return void
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public void deleteEmployee(Long id) throws Exception {
        if (id != null) {
            dao.deleteObject(Employee.class, id);
        }
    }
    
    /**根据多个查询条件执行分页查询 （可以分页，不分页，以及同时进行聚合统计查询，,聚合统计查询是对所有满足条件的数据进行聚合，而不仅仅是当前页的数据）
     * 
     * @param deptId 所属部门 
     * @param recursion 是否递归查询所有下级数据 
     * @param filterColumns 查询条件
     * @param pageIndex 第几页 从1开始
     * @param pageSize 每页显示的数据条数,负数表示不分页
     * @param sortColumn 排序字段（属性名或者字段名）
     * @param sortOrder 排序方式 DESC ASC
     * @return
     * @throws Exception
     * @author user
     * @reviewer
     * @createTime 2021-11-25 16:23:48
     */
    public QueryResultAggregation<EmployeeEx, EmployeeStats> getEmployeeExListAndStats(Long deptId, boolean recursion, List<FilterColumn> filterColumns,
        int pageIndex, int pageSize, String sortColumn, String sortOrder) throws Exception {

        QuerySQL querySql;
        if(recursion){//根据树形结构递归查询所有下级数据
            querySql = DaoUtil.getQuerySql(this.getClass(), "querysqlRecursion");
            Assert.throwz(querySql != null && querySql.valid(), "Employee.sql.xml中<sql id='querysqlRecursion'>没有定义SQL,或者定义的格式不正确");
        }else{
            querySql = DaoUtil.getQuerySql(this.getClass(), "querysql");
            Assert.throwz(querySql != null && querySql.valid(), "Employee.sql.xml中<sql id='querysql'>没有定义SQL,或者定义的格式不正确");
        }
        //设置sql中固化条件的查询值
        querySql.setSqlParameterValues(new Object[]{deptId});
        //增加查询条件和值。将filterColumns中的ColumnName进行处理，如果值为propName，则替换为ColumnName
        querySql.addQueryFilter(filterColumns);

        if(StringUtils.isNotBlank(sortColumn)) {
            querySql.setOrderby(sortColumn, sortOrder);
        }
        QueryResultAggregation<EmployeeEx, EmployeeStats> employeeList = dao.queryEntitiesAndAggregate(EmployeeEx.class, EmployeeStats.class, querySql, new Pagination(pageIndex, pageSize));

        return employeeList;
    }
}
